#!/usr/bin/perl
##########################################################################################################################
##### a script to add object permissions for Users of Wigan-Warriors.com
##########################################################################################################################

##########################################################################################################################
######  TODO list  #######################################################################################################
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
###### Bug list
##########################################################################################################################
##########################################################################################################################

##########################################################################################################################
# Includes
##########################################################################################################################

use lib qw(../cgi-bin);

use define DEBUG_TIMINGS => 0;
use define DEBUG => 0;
use define SQLDEBUG => 0;

use Devel::Profiler bad_pkgs => [qw(UNIVERSAL Time::HiRes B Carp Exporter Cwd Config CORE DynaLoader
   XSLoader AutoLoader DBD::_::st  DBD::_::db  DBD::st  DBD::db  DBI::st  DBI::db  DBI::dr)];

use DBI;
use CGI::Simple;
use POSIX qw(mktime strftime);

use WiganRL::DataObject::User;
use WiganRL::DataObject;
use WiganRL::DataObject::Payment;
use WiganRL::DataObject::Privatemessage;
use WiganRL::DataObject::Player;
use WiganRL::DataObject::Injury;
use WiganRL::DataObject::Image;
use WiganRL::DataObject::View;
use WiganRL::DataObject::News;
use WiganRL::DataObject::Stadium;
use WiganRL::DataObject::Avitem;

use Carp;
use Time::HiRes qw(gettimeofday tv_interval);

use Getopt::Long;

use strict;
#use warnings;
local $SIG{__WARN__} = \&Carp::cluck;  #full call back trace

$|++;  #unbuffered

##########################################################################################################################
# get arguments
##########################################################################################################################

my $id= '';
GetOptions ('id' => \$id);

##########################################################################################################################
# site setup and location variable declarations
##########################################################################################################################
my $cfg= WiganRL::DataObject->load_config('../cgi-bin/wiganrl.ini');
WiganRL::DataObject->cgi_base_url("http://www.wiganwarriorsfans.com".$cfg->val('paths', 'CGI_BASE_URL'));
WiganRL::DataObject->site_base_url("http://www.wiganwarriorsfans.com".$cfg->val('paths', 'SITE_BASE_URL'));
WiganRL::DataObject->site_base_dir($cfg->val('paths', 'SITE_BASE_DIR'));
#WiganRL::DataObject->cachedir($cfg->val('paths', 'SITE_BASE_DIR')."/cached");
WiganRL::DataObject->datadir($cfg->val('paths', 'SITE_DATA_DIR'));
WiganRL::DataObject->template_dir($cfg->val('paths', 'SITE_BASE_DIR')."/templates");
WiganRL::DataObject->dataurl('data');

WiganRL::DataObject->site_clubid($cfg->val('site', 'SITE_CLUBID'));
WiganRL::DataObject->site_nobj_per_page($cfg->val('site', 'SITE_NOBJ_PER_PAGE'));
WiganRL::DataObject->site_mode($cfg->val('site', 'SITE_MODE'));
WiganRL::DataObject->site_postthreshold($cfg->val('site', 'SITE_POSTTHRESHOLD'));

WiganRL::DataObject::Payment->yearlytarget($cfg->val('payment','PAYMENT_YEARLYTARGET'));

WiganRL::DataObject->email_dir($cfg->val('emails', 'EMAIL_BASE_DIR'));
WiganRL::DataObject->smtpserver($cfg->val('emails', 'EMAIL_SMTP_SERVER'));
WiganRL::DataObject->smtpusername($cfg->val('emails', 'EMAIL_SMTP_USERNAME'));
WiganRL::DataObject->smtppassword($cfg->val('emails', 'EMAIL_SMTP_PASSWORD'));
WiganRL::DataObject->email_from($cfg->val('emails', 'EMAIL_FROM'));
WiganRL::DataObject->email_replyto($cfg->val('emails', 'EMAIL_REPLYTO'));
WiganRL::DataObject->send_emails($cfg->val('emails', 'SEND_EMAILS'));
WiganRL::DataObject->email_debug($cfg->val('emails', 'EMAIL_DEBUG_MODE'));
WiganRL::DataObject->email_debuguser($cfg->val('emails', 'EMAIL_DEBUG_USER'));
WiganRL::DataObject->email_debug(1);
my $timingDebug= 1;
my $sqlDebugTime= 1;

my $t0= [gettimeofday];
my $rtime;

my $cgi= CGI::Simple->new();

my $dbh= Diva::DB->new();
$dbh->set( {
	DATABASE_NAME       => $cfg->val('database', 'DATABASE_NAME'),
	DATABASE_SERVER     => $cfg->val('database', 'DATABASE_SERVER'),
	DATABASE_USERNAME   => $cfg->val('database', 'DATABASE_USERNAME'),
	DATABASE_PASSWORD   => $cfg->val('database', 'DATABASE_PASSWORD'),
	DATABASE_TYPE       => $cfg->val('database', 'DATABASE_TYPE'),
	} );
$dbh->connect();

WiganRL::DataObject->dbh($dbh);
WiganRL::Search->dbh($dbh);
WiganRL::DataObject->init_class('WWCOM');  #loads contenttypes
WiganRL::DataObject->cgi($cgi);

use Cache::MemoryCache;
WiganRL::DataObject->cache(new Cache::MemoryCache( { 'namespace' => 'WiganWarriorsFans.com',
								  'default_expires_in' => 30 } ));



$CGI::Simple::DISABLE_UPLOADS= 0;
my $cgi= CGI::Simple->new();
#$cgi->globals('DISABLE_UPLOADS', 0);
$cgi->param('CGI_BASE_URL',WiganRL::DataObject->cgi_base_url.'?');
$cgi->param('SITE_BASE_URL',WiganRL::DataObject->site_base_url);
#$cgi->param('REQUEST_URL','http://'.$r->hostname.$r->unparsed_uri);
WiganRL::DataObject->cgi($cgi);

#set page style
$cgi->cookie('wrStyle') ne '' ? 
	$cgi->param('STYLE',$cgi->cookie('wrStyle')) :
	$cgi->param('STYLE','2010home');

#set BB style
my $bbstyle= substr($cgi->param('STYLE'),4);
if ($cgi->param('STYLE') eq '2010away') {
	$bbstyle= '2010away';
}
if ($bbstyle!~ /(away)|(charity)|(home)/) {
	$bbstyle= 'home';
}
$cgi->param('BBSTYLE',$bbstyle);
WiganRL::DataObject->bbstyle($cfg->val('forums','BBSTYLE_ROOT_URL').$cgi->param('BBSTYLE'));

if ($timingDebug) { $rtime= tv_interval($t0,[gettimeofday]); carp "Session time: $rtime"; }

##########################################################################################################################
# setup session
##########################################################################################################################
use CGI::Session;
my $session= CGI::Session->new;
WiganRL::DataObject->session($session);

##########################################################################################################################
# setup page object 
##########################################################################################################################
use WiganRL::DataObject::Page;
my $page= WiganRL::DataObject::Page->new();
$page->template("Page.Normal.html");

##########################################################################################################################
# default status if still empty
##########################################################################################################################

if ($cgi->param('s') eq '') {
	$cgi->param('s','Forums.Search');
	$cgi->param('search_id','active_topics');
}

##########################################################################################################################
# now add user content
##########################################################################################################################
use WiganRL::DataObject::Usercontent;
my $uc= WiganRL::DataObject::Usercontent->new($cgi->param('s'));
$uc->admin_edit_output(1);
$page->add_object($uc,"Usercontent.Header.html");


##########################################################################################################################
# Site statuses 
##########################################################################################################################
if ($timingDebug) { $rtime= tv_interval($t0,[gettimeofday]); carp "Pre-status: $rtime"; }

# Nice little hack to save writing loads of subroutines for each action.
#      use WiganRL::Status::Home;
#      my $s = WiganRL::Status::Home->new($cgi,$dbh);
#         $s->process($page,$status);
use WiganRL::Status;
WiganRL::Status->cgi($cgi);
WiganRL::Status->dbh($dbh);
WiganRL::Status->user(WiganRL::DataObject::User->new(12032));
#WiganRL::Status->session($session);
WiganRL::Status->enablecache($cfg->val('debug', 'ENABLE_CACHE'));

my $status= $cgi->param('s');
$status=~ /^([^\.]+)\.?/;
my $statusRoot= $1;
$statusRoot=~ s/(\w+)/\u\L$1/g;  #title case

my $redirect= undef;
my $s= undef;

my $code = 'require WiganRL::Status::'.$statusRoot.';';
eval $code;
if ($@ eq '') {
	$s = "WiganRL::Status::$statusRoot"->new();
} else {
	if ($@!~ /^Can\'t locate/) {
		carp $@;
	}
	$@= '';
	$s = WiganRL::Status->new();
}
$redirect= $s->process($page,$status);
#print "\n";
if ($@ ne '') {
	carp $@;
}

##########################################################################################################################
# output page headers or redirection
##########################################################################################################################
if ($timingDebug) { $rtime= tv_interval($t0,[gettimeofday]); carp "Status time: $rtime"; }

my @cookies;
if (defined $redirect and $redirect ne '') {
#	print "<h1>Redirect: $redirect</h1>";
	print(
		$cgi->redirect( -cookie => \@cookies,
			-uri=>$redirect)
	);
	exit(0);
} else {
	@cookies= $cgi->param('_cookiejar');
#	if ($user->loaded) {
		print(
			$cgi->header( -cookie => \@cookies,
			-type  =>  'text/html;  charset=utf-8',
			-expires => '0',
			-CacheControl => 'no-cache')
		);
#	} else {
#		print $cgi->header( -cookie => \@cookies,
#			-type  =>  'text/html;  charset=utf-8',
#			-expires => HTTP::Date::time2str(time+30),  #expires in 30 secs if user not logged in
#			-CacheControl => 'max-age=30');
#	}
}

##debugging
#print "<h1>Status, $status, $statusRoot</h1>";
#print @cookies;
if ($@ ne '') {
	print "<h2>Error: $@</h2>";
	carp $@;
}

##########################################################################################################################
# output page
##########################################################################################################################
if ($timingDebug) { $rtime= tv_interval($t0,[gettimeofday]); carp "Pre-output time: $rtime"; }

#add use defined footer
$uc->template("Usercontent.Footer.html");
$page->add_object($uc);

$page->setupPage();
if ($timingDebug) { $rtime= tv_interval($t0,[gettimeofday]); carp "Page setup time: $rtime"; }

$rtime= tv_interval($t0,[gettimeofday]);
my $o= WiganRL::DataObject->new;
$o->param('PAGE_CONTENT',$page->output);
$o->param('RESPONSE_TIME',"Generated in: $rtime seconds.");

my $output= $o->output('Page.Wrapper.html');
print(
	$o->output_withuservars($output)
);
if ($timingDebug) { $rtime= tv_interval($t0,[gettimeofday]); carp "Output time: $rtime"; }

################### temp debugging for josie
#$s->user->reload;
#if ($s->user->id == 337493 and not $s->user->moderator('VIEW')) {
#	push @{$s->{_EMAILS}},$s->user->buildemail('DEBUG: '.$cgi->param('s'),"User.Debug",
#		'Webmaster','webmaster@wigan-warriors.com');
#}



##########################################################################################################################
# finish up
##########################################################################################################################

	$page->finish;

	if ($timingDebug) { carp "SQL Time: ".$dbh->sql_debug_elapsed." (".$dbh->sql_debug_nqueries.")"; }

	$dbh->disconnect;

##########################################################################################################################
# clear per-request caching 
##########################################################################################################################
#if ($^O!~ /MSWin32/) {
	WiganRL::DataObject->cache->Clear;
#	WiganRL::DataObject->cache->Purge;
#}

	#actual time it took
	$rtime= tv_interval($t0,[gettimeofday]);
	if ($timingDebug) { carp "Request time: $rtime"; }
	exit(0);




